from flask_restful import Resource
from flask import g
from models.news import Channel,UserChannel
from cache.channel import AllChannelCache,UserChannelCache,UserDefaultChannelsCache


class IndexResource(Resource):

    def get(self):
        return 'index view'

#定义字段
from flask_restful import fields,marshal,marshal_with
all_channel_fields = {
    'id':fields.Integer,
    'name':fields.String
}
#获取所有频道
class AllChannelResource(Resource):

    # @marshal_with(all_channel_fields)  #方法一：用装饰器方法时return channels
    def get(self):
        '''
        查询模型，获取对象列表
        对象列表转字典列表
        返回相应
        :return:
        '''
        #方法二：使用marshal
        # channels = Channel.query.filter(Channel.is_visible==True).order_by(Channel.sequence.asc()).all()
        # return marshal(channels,all_channel_fields,envelope='channels')

        #使用缓存直接调用方法获取
        return AllChannelCache.get()

#用户关注频道
class UserChannelResource(Resource):
    '''
    1.先获取用户的信息
    2.如果是登陆用户，我们需要查询 登陆用户的关注频道
            对象列表转换为字典列表
      如果是未登陆用户，我们需要查询 默认的频道
            对象列表转换为字典列表
    3.返回相应

    '''
    #方式一：未使用缓存，直接视图中查询返回
    # def get(self):
    #     user_id = g.user_id
    #     if user_id:
    #         #登陆用户进行数据查询
    #         channels = UserChannel.query.filter(UserChannel.user_id==user_id,
    #                                             UserChannel.is_deleted==False).order_by(UserChannel.sequence).all()
    #     else:
    #         #未登录用户返回默认频道数据
    #         channels = Channel.query.filter(Channel.is_default == True,
    #                                         Channel.is_visible == True).order_by(Channel.sequence,Channel.id).all()
    #     #根据需求，推荐列表必须存在
    #     data_list = [{
    #         'id':0,
    #         'name':'推荐'
    #     }]
    #     #已登录和未登录查询的用户不同，所以name的遍历方法不同
    #     # channel为UserChannel模型中（一对多）一方的db.relationship字段
    #     for channel in channels:
    #         data_list.append({
    #             'id':channel.id,
    #             'name':channel.channel.name if user_id else channel.name
    #         })
    #
    #     return {'channels':data_list}

    #方式二：使用缓存查询（抽取查询代码，保留主逻辑，缓存查询速度快）
    def get(self):
        user_id = g.user_id

        #两种缓存添加方式
        if user_id:
            # 已登录(需要传参)实例调方法class(user_id).get()
            data = UserChannelCache(user_id).get()
        else:
            # 未登录用户(无需传参)类调方法class.get()
            data = UserDefaultChannelsCache.get()

        data_list = [{
            'id': 0,
            'name': '推荐'
        }] + data

        return {"channels": data_list}
